package com.xu.cloud.common.trans;

// import com.xu.cloud.common.util.HttpServletUtil;
// import com.xu.cloud.common.util.JsonUtil;
// import com.xu.cloud.common.util.ResourceUtil;
// import com.xu.cloud.common.util.ServletLogUtil;
// import org.aspectj.lang.ProceedingJoinPoint;
// import org.aspectj.lang.annotation.Around;
// import org.aspectj.lang.annotation.Aspect;
// import org.aspectj.lang.annotation.Pointcut;
// import org.aspectj.lang.reflect.MethodSignature;
// import org.slf4j.Logger;
// import org.slf4j.LoggerFactory;
// import org.springframework.boot.context.properties.bind.BindResult;
// import org.springframework.core.annotation.Order;
// import org.springframework.lang.NonNull;
// import org.springframework.lang.Nullable;
// import org.springframework.web.multipart.MultipartFile;
//
// import javax.servlet.http.HttpServletRequest;
// import javax.servlet.http.HttpServletResponse;
// import java.lang.reflect.Array;
// import java.util.Collection;
// import java.util.Map;
// import java.util.Objects;
//
// /**
//  * 请求日志切面
//  *
//  * @author xuguan
//  * @since 2024/1/9
//  */
// @Order(1)
// @Aspect
// public class TransLogAspect {
//
//     public static final Logger log = LoggerFactory.getLogger(TransLogAspect.class);
//
//     // @Pointcut("execution(* com.xu..*Controller.*(..))")
//     // public void pointcut() {
//     //
//     // }
//
//     @Pointcut("execution(* com.xu..*.*(..))" +
//             "&&(@annotation(org.springframework.web.bind.annotation.RequestMapping)" +
//             "|| @annotation(org.springframework.web.bind.annotation.GetMapping)" +
//             "|| @annotation(org.springframework.web.bind.annotation.PostMapping)" +
//             "|| @annotation(org.springframework.web.bind.annotation.PutMapping)" +
//             "|| @annotation(org.springframework.web.bind.annotation.DeleteMapping))")
//     public void pointcut() {
//
//     }
//
//     @Around("pointcut()")
//     public Object around(ProceedingJoinPoint pjp) throws Throwable {
//         skipStatic(pjp);
//
//         // 请求参数
//         final Object[] args = pjp.getArgs();
//         // 被代理的目标对象
//         final Object target = pjp.getTarget();
//         // 请求方法
//         final MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
//         final String methodName = methodSignature.getMethod().getName();
//         // 请求参数
//         final Class<?>[] parameterTypes = methodSignature.getParameterTypes();
//         final String[] parameterNames = methodSignature.getParameterNames();
//         // 返回类型
//         final Class<?> returnType = methodSignature.getReturnType();
//
//         StringBuilder sb = new StringBuilder();
//
//         sb.append(">>>>>开始执行: ")
//                 .append(target.getClass().getSimpleName())
//                 .append("#")
//                 .append(methodName);
//         sb.append("(");
//         for (int i = 0; i < parameterTypes.length; i++) {
//             sb.append(parameterTypes[i].getSimpleName())
//                     .append(" ")
//                     .append(parameterNames[i]);
//             if (i < parameterNames.length - 1) {
//                 sb.append(", ");
//             }
//         }
//         sb.append(")").append("方法");
//
//         log.info(sb.toString());
//         ServletLogUtil.reqJournalTraceLog();
//
//         for (int i = 0; i < parameterNames.length; i++) {
//             log.info("请求参数arg{}: {}={}", i, parameterNames[i], getValue(args[i]));
//         }
//
//         // 请求执行
//         final Object returnObj = pjp.proceed();
//
//         // 响应日志
//         log.info(">>>>>执行完成, 返回实体类{}: {}", returnType.getSimpleName(), getValue(returnObj));
//
//         return returnObj;
//     }
//
//     private String getValue(@Nullable final Object arg) {
//         String value;
//         if (Objects.isNull(arg)) {
//             value = "[null]";
//         } else if (isFilterObj(arg)) {
//             value = "[ignore]";
//         } else {
//             value = JsonUtil.toJsonString(arg);
//         }
//         return value;
//     }
//
//     private boolean isFilterObj(@NonNull final Object o) {
//         final Class<?> cls = o.getClass();
//
//         if (cls.isArray()) {
//             for (int i = 0; i < Array.getLength(o); i++) {
//                 if (isFilterObj(Array.get(o, i))) {
//                     return true;
//                 }
//             }
//         }
//
//         if (Collection.class.isAssignableFrom(cls)) {
//             return ((Collection<?>) o).stream()
//                     .anyMatch(this::isFilterObj);
//         }
//
//         if (Map.class.isAssignableFrom(cls)) {
//             return ((Map<?, ?>) o).entrySet().stream()
//                     .anyMatch(this::isFilterObj);
//         }
//
//         return o instanceof HttpServletRequest
//                 || o instanceof HttpServletResponse
//                 || o instanceof MultipartFile
//                 || o instanceof BindResult;
//     }
//
//     private void skipStatic(ProceedingJoinPoint pjp) throws Throwable {
//         final String requestUri = HttpServletUtil.currentRequest().getRequestURI();
//         if (ResourceUtil.isStatic(requestUri)) {
//             pjp.proceed();
//         }
//     }
// }
